package com.chenjt.jvm.third.memoryleak;

import java.util.Arrays;
import java.util.EmptyStackException;

/**
 * 注释：
 *
 * 内存泄漏案例一
 *
 * @author chenjt
 * @date 2025/7/10 8:44
 */
public class Stack {

    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack(){
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    /**
     * 入栈
     * @param e
     */
    public void push(Object e){
        ensureCapacity();
        elements[size++] = e;
    }

    /**
     * 出栈（存在内存泄漏）
     * @return
     */
    public Object pop(){
        if(size == 0){
            throw new EmptyStackException();
        }
        // 这里只是把size这个指针往下移了，实际没有释放内存
        return elements[--size];
    }

//    public Object pop(){
//        if(size == 0){
//            throw new EmptyStackException();
//        }
//        Object result = elements[--size];
//        elements[size] = null;
//        return result;
//    }

    /**
     * 确保容量足够，不够的话就做扩容操作
     */
    private void ensureCapacity(){
        if(elements.length == size){
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }

}
